/* Copyright 2010 Gilberto Pacheco Gallegos
 * Licensed under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *     http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License. */
package org.Carol.server;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.annotation.Resource;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.sql.DataSource;

/** Oyente del ciclo de vida de la aplicación web. Es
 * notificado cuando la aplicación se carga y cuando se dá de
 * baja. Se utiliza para asegurar que la tabla Conocido
 * exista. En una aplicación normal el administrador de la
 * base de datos ya tiene creadas las tablas, pero en este
 * caso facilita el uso del demo. */
public class OyenteDeAplicacion implements
    ServletContextListener {
  /** Los objetos DataSource permiten procesar más rápidamente
   *  las conexiones. Para que funcione, el valor de name
   * debe darse de alta en el archivo web.xml. */
  @Resource(name = "jdbc/Libros")
  private DataSource ds;
  /** Se ejecuta cuando el servidor web carga la aplicación.
   * @param sce Descripción del evento. */
    @Override
  public void contextInitialized(
      final ServletContextEvent sce) {
    Connection c = null;
    ResultSet rs = null;
    Statement s = null;
    try {
      // Establece la conexión.
      c = ds.getConnection();
      /* Busca la descripción de la tabla CONOCIDO tal y como
       * está almacenada en el servidor de base de datos.
       * Derby siempre convierte los nombres a mayúsculas,
       * pero otros manejadores pueden funcionar diferente. */
      rs = c.getMetaData().
          getTables(null, null, "Inventario", null);
      // Si la tabla no aparece, se crea.
      if (!rs.next()) {
        s = c.createStatement();
        s.executeUpdate("CREATE TABLE Inventario (\n"
            + "nombre VARCHAR(100) NOT NULL,\n"
            + "autor VARCHAR(100) NOT NULL)");
      }
    } catch (final SQLException ex) {
      // Se indica el problema en la bitácora del servidor.
      sce.getServletContext().log("Error de SQL.", ex);
    } finally {
      if (rs != null) {
        try {
          rs.close();
        } catch (SQLException ex) {
          sce.getServletContext().
              log("Error al cerrar ResultSet.", ex);
        }
      }
      if (s != null) {
        try {
          s.close();
        } catch (SQLException ex) {
          sce.getServletContext().
              log("Error al cerrar Statement.", ex);
        }
      }
      if (c != null) {
        try {
          c.close();
        } catch (SQLException ex) {
          sce.getServletContext().
              log("Error al cerrar Connection", ex);
        }
      }
    }
  }
  /** Se ejecuta al dar de baja la aplicación web.
   * @param sce Descripción del evento. */
    @Override
  public void contextDestroyed(
      final ServletContextEvent sce) {
  }
}
